package com.itheima.service.impl;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.dao.MemberMapper;
import com.itheima.dao.OrderMapper;
import com.itheima.pojo.ReportData;
import com.itheima.service.ReportService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @description:
 * @author: dalao
 * @date: 2020/4/14-19:26
 * @Version: 1.0.0
 */
@Service(interfaceClass = ReportService.class)
@Transactional
public class ReportServiceImpl implements ReportService {
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private OrderMapper orderMapper;
    @Override
    public List<Integer> getMemberReport(List<String> months) {

        List<Integer> memberCount = new ArrayList<>();
//        遍历传过来的过分集合
        for (String month : months) {
//            拼接字符串
            month = month+"-31";
//           调用dubbo服务
            Integer count = memberMapper.getMemberReport(month);
//            添加到集合中
            memberCount.add(count);
        }
        return memberCount;
    }

    @Override
    public List<Map> getSetmealReport() {
//      调用mapper查询  , 查询出来的数据用map的集合保存
        List<Map> mapList= orderMapper.getSetmealReport();
        return mapList;
    }

    @Override
    public ReportData getBusinessReportData() {

        String format = "yyyy-MM-dd";
//        得到现在的时间
        DateTime now = new DateTime();
//        转成字符串格式
        String nowStr = now.toString(format);
//        获取周开始 2020-04-13 00:00:00,并转成字符串
        String beginOfWeek = DateUtil.beginOfWeek(now).toString(format);
//        获取周结束 2020-04-19 23:59:59
        String endOfWeek = DateUtil.endOfWeek(now).toString(format);
//        获取月开始//2020-04-01 00:00:00
        String beginOfMonth = DateUtil.beginOfMonth(now).toString(format);
//        获取周结束//2020-04-30 23:59:59
        String endOfMonth = DateUtil.endOfMonth(now).toString(format);
//       创建报表对象
        ReportData data = new ReportData();
//        设置当前日期
        data.setReportDate(nowStr);
//        -- 今日新增会员数：注册日期是今天
        data.setTodayNewMember(memberMapper.findMemberCountByDate(nowStr));
//        -- 总会员数：整个会员表所有的数据
        data.setTotalMember(memberMapper.findMemberTotalCount());
//        -- 本周新增会员数：注册日期大于本周一（难点：怎么获取本周一）
        data.setThisWeekNewMember(memberMapper.findMemberCountAfterDate(beginOfWeek));
//        -- 本月新增会员数：注册日期大于本月一号（难点：怎么获取本月一号）
        data.setThisMonthNewMember(memberMapper.findMemberCountAfterDate(beginOfMonth));
//        -- 今日预约数：预约时间是今天
        data.setTodayOrderNumber(orderMapper.findOrderCountByDate(nowStr));
//        -- 今日到诊数：预约时间是今天并且状态是已到诊
        data.setTodayVisitsNumber(orderMapper.findVisitsCountByDate(nowStr));
//        -- 本周预约数：预约日期在本周一到本周日之间的（难点：怎么获取本周一，本周日）
        data.setThisWeekOrderNumber(orderMapper.findOrderCountBetweenDate(beginOfWeek,endOfWeek));
//        -- 本周到诊数：预约日期在本周一到本周日之间的并且状态是已到诊
        data.setThisWeekVisitsNumber(orderMapper.findVisitsCountBetweenDate(beginOfWeek,endOfWeek));
//        -- 本月预约数：预约日期在本月1号到本月的最后一天之间的（难点：怎么获取本月1号，本月最后一天）
        data.setThisMonthOrderNumber(orderMapper.findOrderCountBetweenDate(beginOfMonth,endOfMonth));
//        -- 本月到诊数：预约日期在本月1号到本月的最后一天之间的并且状态是已到诊
        data.setThisMonthVisitsNumber(orderMapper.findVisitsCountBetweenDate(beginOfMonth,endOfMonth));
//        -- 热门套餐：预约数量靠前的（可以把每个套餐的预约数量统计出来，然后从大到小排序，再取前面几个）
        data.setHotSetmeal(orderMapper.findHotSetmeal());
        return data;
    }
}
